//思路:该题的意思是在一个数组中选出一个或多个数使得
//总和为sum(总金额,即金额的总和)-total(实际记上的金额,即第一个输入的数).
//该题可以使用回溯法,对当前位置选择加入或不加入,直到选出来的数等于sum-total.

#include<bits/stdc++.h>
#define sd(n) scanf("%d",&n) 
#define sld(n) scanf("%lld",&n)
#define pd(n) printf("%d", (n))
#define pld(n) printf("%lld", n)
#define all(x) (x).begin(),(x).end()
#define rall(x) (x).rbegin(),(x).rend()
#define fi first
#define se second
const int N = 110;
#define INF 0x7fffffff
typedef long long int ll;
using namespace std;
//----------------------------------------------------------------------------//
int n, m, a[N], sum;
int st[N];//与a[N]下标做映射
void dfs(int u)
{
	if (u > m)
	{
		int sum2 = 0;
		bool ok=false;
		for (int i = 1; i <= m; i++)
		{
			if (st[i] == 0)
			{
				sum2+=a[i];
				if(sum2>sum-n) return;
				if(i>1&&a[i-1]==a[i]&&st[i-1]==1&&st[i]==0) return;
			}
		}
		if (sum2 == (sum - n))
		{
			ok=true;
			for (int i = 1; i<= m; i++)
				if (st[i] == 0) cout << a[i]<< " ";
		}
		if(ok) puts("");
		return;
	}
	st[u] = 0;
	dfs(u + 1);
	st[u] = 1;
	dfs(u + 1);
	st[u] = 0;
}
int main()
{
	sd(n); sd(m);
	for(int i = 1; i <= m; i++) sd(a[i]), sum += a[i];
	sort(a + 1, a + 1 + m);//排的升序我的,所以以0为放1为不放,下次加个greater<int>()
	dfs(1);
	return 0;
}